
// CommunicateComm.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "CommunicateComm.h"
#include "CommunicateCommDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CCommunicateCommApp

BEGIN_MESSAGE_MAP(CCommunicateCommApp, CWinApp)
	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CCommunicateCommApp construction

CCommunicateCommApp::CCommunicateCommApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}


// The one and only CCommunicateCommApp object

CCommunicateCommApp theApp;


// CCommunicateCommApp initialization

BOOL CCommunicateCommApp::InitInstance()
{
	// InitCommonControlsEx() is required on Windows XP if an application
	// manifest specifies use of ComCtl32.dll version 6 or later to enable
	// visual styles.  Otherwise, any window creation will fail.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// Set this to include all the common control classes you want to use
	// in your application.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	// Create the shell manager, in case the dialog contains
	// any shell tree view or shell list view controls.
	CShellManager *pShellManager = new CShellManager;

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	// of your final executable, you should remove from the following
	// the specific initialization routines you do not need
	// Change the registry key under which our settings are stored
	// TODO: You should modify this string to be something appropriate
	// such as the name of your company or organization
	SetRegistryKey(_T("Local AppWizard-Generated Applications"));

	CCommunicateCommDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Delete the shell manager created above.
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}

int GetErrorString(PBYTE pBufferOut, int *nBufferLen, DWORD dwError){
	HLOCAL hlocal = NULL;   // Buffer that gets the error message string
	// Get the error code's textual description
	BOOL fOk = FormatMessage(
		FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, 
		NULL, dwError, MAKELANGID(/*LANG_ENGLISH*/LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED/*SUBLANG_ENGLISH_US*/), 
		(PTSTR) &hlocal, 0, NULL);

	if (!fOk) { // Is it a network-related error?
		HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES); 
		if (hDll != NULL) {
			FormatMessage(
				FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
				hDll, dwError, MAKELANGID(/*LANG_ENGLISH*/LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED/*SUBLANG_ENGLISH_US*/),
				(PTSTR) &hlocal, 0, NULL);
			FreeLibrary(hDll);
		}
	}
	int nLen = 0;
	if (fOk && hlocal != NULL) {
		nLen = strlen((PTSTR)LocalLock(hlocal));
		*nBufferLen = (nLen < *nBufferLen) ? nLen : *nBufferLen;
		memcpy(pBufferOut, (void*)LocalLock(hlocal), *nBufferLen);
		LocalFree(hlocal);
	}
	return nLen;
}